home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / copper / skip1.s < prev    next >
Text File  |  1996-07-24  |  5KB  |  180 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.         * Coded by:                        *
  14.         * The Dark Coder / Morbid Visions  *
  15.         ************************************
  16.  
  17. ; commenti alla fine del sorgente
  18.  
  19.     SECTION    DK,code
  20.  
  21.     incdir    "Infamia:MV_code/"
  22.     include    MVstartup.s        ; Codice di startup: prende il
  23.                     ; controllo del sistema e chiama
  24.                     ; la routine START: ponendo
  25.                     ; A5=$DFF000
  26.  
  27.         ;5432109876543210
  28. DMASET    EQU    %1000001010000000    ; copper DMA
  29.  
  30.  
  31. START:
  32.  
  33.     move    #DMASET,dmacon(a5)
  34.     move.l    #COPPERLIST,cop1lc(a5)
  35.     move    d0,copjmp1(a5)
  36.  
  37.     move.l    #copperloop,cop2lc(a5)    ; carica l'indirizzo del loop
  38.                     ; in COP2LC
  39.  
  40. mouse:
  41.  
  42.     bsr    MuoviCopper
  43.  
  44. ; notare il doppio controllo sulla sincronia
  45. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  46.     move.l    #$1ff00,d1    ; bit per la selezione tramite AND
  47.     move.l    #$13000,d2    ; linea da aspettare = $130, ossia 304
  48. .Waity1
  49.     move.l    vposr(a5),d0    ; vposr e vhposr
  50.     and.l    d1,d0        ; seleziona solo i bit della pos. verticale
  51.     cmp.l    d2,d0        ; aspetta la linea $130 (304)
  52.     bne.s    .waity1
  53.  
  54. .Waity2
  55.     move.l    vposr(a5),d0
  56.     and.l    d1,d0
  57.     cmp.l    d2,d0
  58.     beq.s    .waity2
  59.  
  60.     btst    #6,$bfe001        ; attendi tasto mouse
  61.     bne.s    mouse
  62.  
  63.     rts
  64.  
  65. ************************************************
  66. * Questa routine cicla i colori nella copperlist
  67. MuoviCopper:
  68.     lea    copperloop,a0
  69.  
  70.     move.w    6(a0),d0
  71.  
  72.     moveq    #7-1,d1        ; vengono ciclati solo 8 colori
  73. .loop    move.w    14(a0),6(a0)
  74.     addq.l    #8,a0
  75.     dbra    d1,.loop
  76.  
  77.     move.w    d0,6(a0)
  78.     rts
  79.  
  80.     SECTION    COPPER,DATA_C
  81.  
  82. COPPERLIST:
  83.  
  84. ; barra 1
  85.     dc.l $01800111
  86.     dc.l $2907fffe
  87.     dc.l $01800a0a
  88.     dc.l $2a07fffe
  89.     dc.l $0180011f
  90.     dc.l $2b07fffe
  91.     dc.l $01800000
  92.  
  93.     dc.w    $3007,$FFFE    ; aspetta la linea $30
  94.  
  95. copperloop:            ; da qui inizia il loop
  96.     dc.w    $0007,$87fe    ; aspetta inizio linea 0 - poiche` sono
  97.                 ; mascherati i bit da 3 a 7 della posizione
  98.                 ; verticale, questa wait aspettera` tutte le
  99.                 ; linee che hanno i bit da 0 a 2 azzerati
  100.                 ; cioe` le linee $30,$38,$40,$48, ecc
  101.     dc.w    $180,$080
  102.     dc.w    $0107,$87fe    ; aspetta inizio linea 1 - poiche` sono
  103.                 ; mascherati i bit da 3 a 7 della posizione
  104.                 ; verticale, questa wait aspettera` tutte le
  105.                 ; linee che hanno i bit da 0 a 2 al valore %001
  106.                 ; cioe` le linee $31,$39,$41,$49, ecc
  107.     dc.w    $180,$0a0
  108.     dc.w    $0207,$87fe
  109.     dc.w    $180,$0c0
  110.     dc.w    $0307,$87fe
  111.     dc.w    $180,$0e0
  112.     dc.w    $0407,$87FE
  113.     dc.w    $180,$0c0
  114.     dc.w    $0507,$87FE
  115.     dc.w    $180,$0a0
  116.     dc.w    $0607,$87FE
  117.     dc.w    $180,$080
  118.     dc.w    $0707,$87FE
  119.     dc.w    $180,$088
  120.     dc.w    $00e1,$80FE    ; aspetta la fine dell'ultima riga del loop
  121.                 ; questa istruzione e` necessaria, in quanto
  122.                 ; se la WAIT della linea 0 viene eseguita
  123.                 ; prima della fine della linea 7 non blocca
  124.  
  125.     dc.w    $6007,$ffff    ; SKIP alla linea $60
  126.     dc.w    $8a,0        ; scrive in COPJMP2 - salta ad inizio loop
  127.  
  128.     dc.w    $180,$000
  129.     dc.w $FFDF,$FFFE    ; aspetta la linea 255
  130.  
  131. ; barra 2
  132.     dc.l $01800000
  133.     dc.l $1407fffe
  134.     dc.l $0180011f
  135.     dc.l $1507fffe
  136.     dc.l $01800a0a
  137.     dc.l $1607fffe
  138.     dc.l $01800111
  139.  
  140.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  141.  
  142.     end
  143.  
  144. Questo esempio mostra un uso dei copperloop. Vogliamo realizzare una copperlist
  145. che cambi il COLOR00 ad ogni linea di raster. Come avete imparato nelle prime
  146. lezioni del corso, e` sufficente scrivere una copperlist che faccia una wait
  147. ad ogni riga seguita da una coppermove nel registro COLOR00. Se per esempio
  148. vogliamo cambiare il COLOR00 dalla linea $30 alla linea $60 dobbiamo scrivere
  149. le seguenti istruzioni nella copperlist:
  150.  
  151.     dc.w    $3007,$fffe    ; aspetta la linea $30
  152.     dc.w    $180,$345    ; scrive nel color00
  153.     dc.w    $3107,$fffe    ; aspetta la linea $31
  154.     dc.w    $180,$456    ; scrive nel color00
  155.     
  156.     .
  157.     .
  158.  
  159.     dc.w    $6007,$fffe    ; aspetta la linea $60
  160.     dc.w    $180,$000    ; scrive nel color00
  161.  
  162. Questo pezzo di copperlist occupa 4 word per ogni riga di raster, per un
  163. totale di 8*($60-$30)=384 bytes. Se vogliamo far scorrere i colori, dobbiamo
  164. usare una routine 68000 che legga tutti i colori e li riscriva, tipo la routine
  165. MuoviCopper di questo esempio. Tale routine dovra` eseguire un'iterazione per
  166. ogni linea di raster, nel nostro caso dunque $30=48 iterazioni.
  167. Se i colori da scrivere in COLOR00 sono tutti diversi questo e` l'unico metodo
  168. possibile. Se pero` i colori non sono diversi ma si ripetono dopo un po' e`
  169. possibile usare un copperloop. Nel nostro esempio, vogliamo ripetere una
  170. sequenza di 8 colori. Poiche` il nostro effetto va dalla riga $30 alla $60
  171. (48 righe) vuol dire che ripetiamo la stessa sequenza 6 volte. Possiamo 
  172. quindi scrivere un copperloop che ripeta gli 8 colori e farlo ripetere
  173. dalle linee $30 a $60. Il loop (che potete vedere nel listato) occupa 
  174. 4 word per ogni colore che scrive, piu` altre 3 istruzioni che occupano
  175. ciascuna 2 words (la WAIT fino alla fine dell'ultima riga, la SKIP e quella
  176. che scrive in COPJMP2), per un totale di 8*4+3*2=38 words ovvero 56 bytes,
  177. contro i 384 della copperlist senza loop. Inoltre la routine che cicla i
  178. colori deve fare solamente 8 iterazioni contro le 48 del caso "tradizionale",
  179. ovvero va circa 6 volte piu` veloce.
  180.